.TITLE DRGCL .IDENT /06.04/ ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. W. BERZLE ; J. R. KAUFFMAN ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; B. S. MCCARTHY 5-MAR-87 06.04 ; ; BM385 -- ADD $DRGC1 LABEL FOR MOVEMENT TO ; VECTOR COMMON. ALSO MOVE $RLMCB ; to DREIF ; ;+ ; **-$DRGCL-GET COMMAND LINE ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE 80. BYTE BUFFER IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ;- .MCALL PKTDF$,TCBDF$ .IF DF N$$DIR .MCALL LNMDF$ LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS .ENDC ;DF N$$DIR PKTDF$ ;DEFINE COMMAND BUFFER OFFSETS TCBDF$ ;TCB OFFSETS .IIF GE </100>-200 .ERROR ;LENGTH TOO LONG .IF DF D$$PAR $DRGC1:: .IFF ; DF D$$PAR $DRGCL:: .ENDC ; DF D$$PAR MOVB -(R3),R0 ;GET DPB SIZE CMPB (R3)+,#41. ;IS IT GMCR$ BEQ GMCR ;IF EQ YES CMPB R0,#3 ;IS IT SNXC$ BEQ SNXC ;IF EQ YES .IF DF A$$CLI CMPB R0,#7 ;IS IT GCCI$ BEQ GCCI ;IF EQ YES .ENDC ;A$$CLI DRSTS D.RS99 ;ILLEGAL DPB SIZE ;+ ; **-GMCR$ DIRECTIVE ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSFER A 1 TO 80. ; BYTE COMMAND LINE TO THE LAST MCR FUNCTION TASK REQUESTED BY ; THE MCR DISPATCHER. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(127.),DPB SIZE(41.). ; WD. 01 -- FIRST WORD OF 80. BYTE BUFFER. ; . ; . ; . ; WD. 50 -- LAST WORD OF 80. BYTE BUFFER. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS EQUAL TO THE LENGTH OF THE COMMAND LINE ; IN BYTES IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING ; TASK IS NOT THE LAST TASK THAT WAS REQUESTED ; BY THE MCR DISPATCHER. ; ;- GMCR: CALL $SCMDQ ;SEARCH COMMAND QUEUE FOR A PACKET BCC 30$ ;IF CC, FOUND ONE 20$: DRSTS D.RS80 ;NO COMMAND PRESENT 30$: MOV R3,R4 ;SET DESTINATION DISPLACEMENT MOV KISAR6,R3 ;SET DESTINATION APR BIAS MOV R0,KISAR6 ;MAP COMMAND BIT #CC.CLI,C.CSTS+140000 ;IS COMMAND INTENDED FOR CLI BNE 20$ ;IF NE YES MOV R0,-(SP) ;SAVE ADDRESS OF BUFFER MOV R0,R1 ;SET SOURCE APR BIAS MOVB C.CBLK+140000,R5 ;GET SIZE OF BLOCK SWAB R5 ;PUT IN HIGH BYTE BISB C.CTR+140000,R5 ;GET TERMINATOR CHARACTER IN LOW BYTE MOV C.CSO+140000,-(SP) ;GET OFFSET TO START RETURNING FROM MOV C.CCT+140000,R0 ;GET NUMBER OF CHARACTERS IN BUFFER CMP #79.,R0 ;CAN ENTIRE BUFFER BE RETURNED BHIS 50$ ;IF HIS YES CLR 2(SP) ;DO NOT DEALLOCATE BUFFER AFTER COPYING MOV #78.,R0 ;SET NUMBER OF CHARACTERS TO RETURN ADD R0,C.CSO+140000 ;SET TO STARTING OFFSET FOR NEXT TIME SUB R0,C.CCT+140000 ;REMOVE THESE FROM CHARACTERS PRESENT COUNT 50$: MOV #C.CTXT+120000,R2 ;DISPLACEMENT OF START OF SOURCE TEXT ADD (SP)+,R2 ;POINT TO FIRST CHARACTER TO RETURN .IF NDF D$$PAR ADD R0,4(SP) ;SET CHARACTER COUNT +1 IN DSW .IFF ; NDF D$$PAR ADD R0,10(SP) ;SET CHARACTER COUNT +1 IN DSW .IFTF ; NDF D$$PAR TST R0 ;IS THERE ANY TEXT BEQ 55$ ;IF EQ NO CALL $BLXIO ;COPY CHARACTERS INTO USER DPB 55$: MOV R3,KISAR6 ;MAP DESTINATION AGAIN MOVB #15,R3 ;ASSUME CONTINUATION MUST BE INDICATED MOVB #'-,(R4)+ ;HYPHEN FOR ASSUMED CONTINUATION MOV (SP)+,R1 ;GET ADDRESS OF SOURCE BLOCK BEQ 60$ ;IF EQ, THERE IS CONTINUATION .IFT ; NDF D$$PAR DEC 2(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 .IFF ; NDF D$$PAR DEC 6(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 .ENDC ; NDF D$$PAR DEC R4 ;SET TO OVERWRITE HYPHEN WITH TERMINATOR MOV #$CLICQ,R0 ;POINT TO QUEUE LISTHEAD CALL $GTSPK ;DEQUEUE PACKET MOV R1,R0 ;COPY PACKET ADDRESS MOVB R5,R3 ;GET REAL TERMINATOR SWAB R5 ;GET SIZE OF BLOCK IN LOW BYTE MOVB R5,R1 ;GET SIZE OF BLOCK CALL $DESEC ;DEALLOCATE IT 60$: MOVB R3,(R4) ;PUT TERMINATOR IN BUFFER RETURN ;ALL DONE ;+ ; **-SNXC$ DIRECTIVE ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL THE TERMINAL DRIVER ; TO HAVE IT SEND THE NEXT COMMAND FROM THE SPECIFIED TERMINAL ; TO THE CLI DISPATCHER FOR EXECUTION. THE NEED FOR THIS ARISES WHEN ; THE TERMINAL IS IN SERIAL COMMAND EXECUTION MODE. NORMALLY, THE ; NEXT COMMAND WILL BE CALLED FOR BY DREIF FOR WHEN A TASK WITH T3.CMD SET ; EXITS. IF THE TASK PROCESSING THE COMMAND WILL NOT EXIT HOWEVER, THIS ; DIRECTIVE PROVIDES A WAY FOR IT TO SIGNAL TO THE SYSTEM THAT COMMAND ; EXECUTION IS COMPLETE, AND THE NEXT COMMAND CAN BE SENT FROM THE ; TYPEAHEAD BUFFER INSIDE THE DRIVER. ; IF THE TASK ISSUING THE DIRECTIVE IS SET TO PROMPT ON EXIT ; HOWEVER, A TASK EXIT PROMPT WILL BE QUEUED UP INSTEAD OF CALLING ; THE DRIVER. THE DRIVER WILL GET CALLED BY MCR... AFTER IT HAS ; PROCESSED THE TASK EXIT PROMPT, OR BY A RE-ISSUANCE OF THE ; SNXC$ DIRECTIVE BY THE CLI IF THE CLI IS RECEIVING TASK EXIT ; PROMPT REQUESTS. THIS SCHEME CORRECTLY SYNCHRONIZES THE PROMPT ; REQUESTS AND COMMAND LINES ON THE USER'S TERMINAL. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(127.),DPB SIZE(3.) ; WD. 01 -- ASCII NAME OF TERMINAL TO REQUEST COMMAND FROM ; WD. 02 -- OCTAL UNIT NUMBER OF TERMINAL ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE ; LENGTH IS ILLEGAL. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE ; SPECIFIED TERMINAL IS NOT THE TASK'S TI:, ; AND THE TASK IS NOT PRIVILEGED OR A CLI. ; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF THE ; SPECIFIED DEVICE DOES NOT EXIST, OR IS NOT A TTY. ; ;- SNXC: MOV (R3)+,R0 ;GET NAME OF DEVICE IF SPECIFIED BEQ 10$ ;IF EQ, DEVICE NOT SPECIFIED MOV (R3),R1 ;GET UNIT NUMBER CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESS BCS 40$ ;IF CS, DEVICE DOES NOT EXIST MOV R2,R0 ;COPY UCB ADDRESS CALL $MPLND ;FOLLOW ANY REDIRECTS BIT #DV.TTY,U.CW1(R0) ;IS DEVICE A TERMINAL BEQ 40$ ;IF EQ NO BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED OR CLI BNE 20$ ;IF NE YES CMP T.UCB(R5),R0 ;DID TASK SPECIFY ITS OWN TI: BEQ 20$ ;IF EQ YES DRSTS D.RS16 ;PRIVILEGE VIOLATION 10$: MOV T.UCB(R5),R0 ;DEFAULT UCB TO TASK'S TI: 20$: ADD #T.ST3,R5 ;POINT TO T.ST3 BIT #T3.MCR,(R5) ;WILL TASK PROMPT ON EXIT BEQ 50$ ;IF EQ NO MOV #CC.EXT,R1 ;SET TASK EXIT PROMPT BIT #T3.CMD,(R5) ;IS TASK PART OF CMD FROM TERMINAL BEQ 30$ ;IF EQ NO BIS #CC.TTD,R1 ;FORCE CALL OF $SNCMD AT SOME POINT 30$: MOV R0,R2 ;COPY UCB ADDRESS CALL $QCNTP ;QUEUE TASK EXIT PROMPT REQUEST BR 60$ ; 40$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIED 50$: BIT #T3.CMD,(R5) ;IS TASK PART OF CLI CMD FROM TTY BEQ 70$ ;IF EQ NO CALL $SNCMD ;HAVE TTDRV SEND NEXT CMD 60$: BIC #T3.MCR!T3.CMD,(R5) ;DON'T DO THIS AGAIN 70$: RETURN ;THE END ;+ ; **-GCCI$ DIRECTIVE ; ; THIS DIRECTIVE IS USED BY A CLI TASK TO GET A COMMAND LINE. IT CANNOT ; BE ISSUED BY A NON-CLI TASK. IT OFFERS SUCH CAPABILITIES AS RETURNING ; A SPECIFIC COMMAND, IDENTIFYING THE COMMAND'S PARENT TASK, LEAVING A ; COMMAND QUEUED AFTER RETREIVAL FOR RETREIVAL AGAIN BY A FUTURE DIRECTIVE, ; AND RETURNING INFORMATION ABOUT THE TERMINAL THE COMMAND ORIGINATED FROM. ; ; THE FORMAT OF THE COMMAND BUFFER SET UP IN THE CLI TASK SPACE IS: ; ; +---------------------------------------+ ; ! ASCII DEV NAME OF ISSUING TTY ! ; !---------------------------------------! ; ! NUM OF CHAR RETURNED ! OCTAL UNIT NUM.! ; !---------------------------------------! ; ! COMMAND SIZE ! ; !---------------------------------------! ; ! STATUS ! TERMINATOR ! ; !---------------------------------------! ; ! ! ; ! COMMAND TEXT IN ASCII ! ; ! ! ; +---------------------------------------+ ; ; ; THE FORMAT OF THE INFORMATION BUFFER IN THE CLI TASK SPACE IS: ; ; +---------------------------------------+ ; ! U.CW2 OF ISSUING TERMINAL ! ; !---------------------------------------! ; ! NAME OF PARENT TASK (IF ANY) ! ; ! (2 WORDS) ! ; !---------------------------------------! ; ! ADDRESS OF OCB FROM PARENT ! ; !---------------------------------------! ; ! LOGIN UIC OF ISSUING TERMINAL ! ; !---------------------------------------! ; ! CURRENT UIC OF ISSUING TERMINAL ! ; !---------------------------------------! ; ! ADDR OF CMD. IF NOT DEQUEUED ! ; +---------------------------------------+ ; ; EXTRA FIELDS CAN BE ADDED TO THE END OFF THIS BUFFER IF REQUIRED, BECAUSE ; THE TASK SUPPLIES BOTH THE ADDR AND LENGTH OF ITS TASK BUFFER. ONLY ; THAT MUCH DATA IS COPIED BACK TO THE TASK. THE TASK BUFFER IS FILLED ; FROM THE FRONT WITH THE FIELDS IN THE ABOVE ORDER. IF THE BUFFER ; IS NOT LONG ENOUGH TO HOLD ALL OF THE DATA, THE FIELDS THAT WOULD ; NOT FIT ARE NOT SUPPLIED, BUT NO INDICATION OF THIS DATA TRUNCATION ; IS GIVEN TO THE TASK. THUS IF MORE FIELDS ARE ADDED IN A FUTURE RELEASE, ; OLD TASKS WOULD STILL WORK SINCE THEY WILL GET EXACTLY WHAT THEY GOT ; BEFORE, THEY JUST WOULD NOT GET THE NEW DATA. ; ; DPB FORMAT FOR GCCI$ DIRECITVE: ; ; WD. 00 -- DIC(127.),DPB SIZE(7.). ; WD. 01 -- NO COMMAND PRESENT ACTION, HIGH BYTE RESERVED. ; WD. 02 -- ADDRESS OF COMMAND TO BE RETURNED. ; WD. 03 -- ADDRESS OF COMMAND BUFFER INSIDE TASK. ; WD. 04 -- LENGTH OF TASK'S COMMAND BUFFER. ; WD. 05 -- ADDRESS OF OPTIONAL INFORMATION BUFFER IN TASK. ; WD. 06 -- LENGTH OF TASK'S INFORMATION BUFFER. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED IF A COMMAND HAS ; BEEN SUCCESSFULLY RETURNED TO THE CLI ; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF NO COMMAND ; IS QUEUED FOR THE CLI, AND THE CLI INDICATED ; THAT IT WANTED TO BE STOPPED. THE CLI WILL GET ; THIS STATUS AFTER IT IS UNSTOPPED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGAL ; DPB SIZE IS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF EITHER ; BUFFER OR THE DPB ARE NOT ENTIRELY WITHING ; THE TASK'S ADDRESS SPACE. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF ; A GCCI$ WITH STOP ON NO COMMAND OPTION WAS ISSUED ; FROM AST STATE ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE ISSUING ; TASK IS NOT A CLI ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED FROM A GCCI$ ; DIRECTIVE IF THERE IS NO COMMAND QUEUED FOR THE ; CLI, AND THE TASK WANTED AN ERROR RETURNED IN ; THIS CASE. ; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE ; ISSUING CLI TASK ATTEMPTED TO RECEIVE A ; COMMAND FROM A TERMINAL WITH A DIFFERENT ; PROTECTION UIC FROM THE CLI'S CURRENT GROUP ; AND THE CLI HAD AN ACTIVE GROUP GLOBAL CONTEXT ; FOR THE FORMER GROUP. ; ; ;- ASSUME CC.EXT,4 ASSUME CC.PRM,2 .IF DF A$$CLI GCCI: BIT #T3.CLI,T.ST3(R5) ;IS TASK A CLI BNE 100$ ;IF NE NO DRSTS D.RS16 ;SET DIRECTIVE STATUS 100$: MOV (R3)+,-(SP) ;SAVE NO CMD ACTION TST T.ST2(R5) ;TASK AT AST STATE?? BPL 103$ ;IF PL NO BIT #2,(SP) ;IS STOP ON NO COMMAND OPTION SPECIFIED BEQ 103$ ;IF EQ NO DRSTS D.RS80 ;SET DIRECTIVE STATUS 103$: MOV (R3)+,R4 ;SAVE DESIRED CMD ADDR MOV (R3)+,R0 ;GET CMD BUFFER ADDRESS BNE 110$ ;IF NE, THERE IS A BUFFER 105$: DRSTS D.RS98 ;SET DIRECTIVE STATUS 110$: MOV (R3)+,R1 ;GET LENGTH CMP #11,R1 ;IS IT ABOVE MINIMUM LENGTH BHI 105$ ;IF HI NO MOV R1,$TEMP0 ;SAVE LENGTH OF TASK CMD BUFFER MOV R0,-(SP) ;SAVE ADDRESS OF TASK CMD BUFFER CALL $ACHKW ;ADDRESS CHECK COMMAND BUFFER MOV (R3)+,R0 ;GET INFO BUFFER ADDRESS BEQ 120$ ;IF EQ, NO BUFFER MOV (R3),R1 ;GET INFO BUFFER LENGTH BMI 105$ ;IF MI, ILLEGAL LENGTH CALL $ACHKW ;ADDRESS CHECK INFO BUFFER 120$: MOV $CLICQ,R0 ;GET ADDRESS OF FIRST PACKET IT QUEUE BEQ 131$ ;IF EQ, QUEUE IS EMPTY 130$: CALL $SRCQ1 ;FIND A COMMAND FOR THIS CLI BCC 140$ ;IF CC, FOUND ONE ; ; NO COMMAND EXISTS FOR THIS CLI ; 131$: TST (SP)+ ;CLEAN STACK MOV (SP)+,R0 ;GET DESIRED ACTION CODE BEQ 135$ ;IF EQ, RETURN ERROR ASR R0 ;FORCE TASK TO EXIT?? BCS 133$ ;IF CS YES ASR R0 ;FORCE TASK TO STOP?? BCC 135$ ;IF CC NO, RETURN ERROR CALL $STPCT ;STOP THE TASK DRSTS D.RS00 ;SET IS.CLR 133$: JMP $DREXT ;FORCE THE TASK TO EXIT 135$: DRSTS D.RS8 ;SET ERROR CONDITION ; ; CAN THIS PACKET BE USED ; 140$: MOV R0,KISAR6 ;MAP PACKET CMP R4,R0 ;IS IT THE DESIRED ONE? BEQ 150$ ;IF EQ YES TST R4 ;TAKE ANY ONE? BEQ 150$ ;IF EQ YES 145$: MOV @#140000,R0 ;POINT TO NEXT IN LIST BR 130$ ;RESTART SEARCH 150$: BIT #CC.CLI,@#C.CSTS+140000 ;IS THIS COMMAND FOR A CLI BEQ 145$ ;IF EQ NO MOV @#C.CUCB+140000,R4 ;GET UCB ADDRESS MOV R0,-(SP) ;SAVE PACKET ADDRESS BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGE BNE 190$ ;IF NE YES .IF DF X$$HDR MOV $SAHDB,KISAR6 ;MAP HEADER MOV $SAHPT,R0 ;GET ADDRESS OF HEADER .IFF ;X$$HDR MOV $HEADR,R0 ;GET ADDRESS OF HEADER .ENDC ;X$$XDR ADD #H.CUIC,R0 ;POINT TO PROTECTION GROUP TSTB T.GGF(R5) ;TASK HAVE ACTIVE GOUPT GLOBAL CONTEXT? BEQ 152$ ;IF EQ NO CMPB U.LUIC(R4),1(R0) ;SAME GROUP? BEQ 152$ ;IF EQ YES DRSTS D.RS17 ;RETURN IE.RSU ERROR 152$: .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 153$ ;NONE CALL $DLCTX ;DELETE CONTEXT BLOCK .ENDC ;DF N$$DIR 153$: MOV T.OCBH(R5),R1 ;POINT TO OCB LIST BR 155$ ; 154$: MOV (R1),R1 ;POINT TO NEXT OCB 155$: BEQ 156$ ;IF EQ, END OF OCB LIST CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND BNE 154$ ;IF NE NO .IF DF N$$DIR MOV O.STAT+10(R1),T.CTX(R5) ;PUT CONTEXT BLOCK FROM OCB INTO TCB .ENDC ;DF N$$DIR MOV O.STAT+4(R1),(R0) ;SET NEW PROTECTION UIC MOV (R0)+,-(SP) ;SAVE PROTECTION UIC MOV O.STAT+6(R1),(R0) ;SET NEW DEFAULT UIC BIS (R0)+,(SP)+ ;EITHER UIC SPECIFIED ? BNE 158$ ;IF NE YES, LEAVE THEM CMP -(R0),-(R0) ;BACK UP UIC POINTER BR 157$ ; 156$: .IF DF N$$DIR MOV U.CTX(R4),T.CTX(R5) ;PUT CONTEXT BLOCK FROM TERM INTO TCB .ENDC ;DF N$$DIR 157$: MOV U.LUIC(R4),(R0)+ ;SET NEW PROTECTION UIC MOV U.UIC(R4),(R0)+ ;SET NEW DEFAULT UIC 158$: .IF DF N$$DIR MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV T.CTX(R5),KISAR6 ;MAP CONTEXT BLOCK BEQ 1585$ ;IF EQ, NONE INCB C.REF+140000 ;INCREMENT REFERENCE COUNT 1585$: MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC ;DF N$$DIR 159$: MOV -2(R3),R0 ;GET ADDR OF INFO BUFFER IF PRESENT BEQ 190$ ;IF EQ, NO INFO BUFFER CALL $RELOC ;RELOCATE ADDRESS MOV R1,KISAR6 ;MAP INFO BUFFER IN USER TASK SPACE MOV (R3),R3 ;GET LENGTH OF BUFFER ; ; FILL INFORMATION BUFFER IN TASK SPACE; ; ASR R3 ;CONVERT TO WORD COUNT BCS 105$ ;IF CS, LENGTH IS NOT EVEN BEQ 190$ ;IF EQ, BUFFER HAS LENGTH ZERO MOV U.CW2(R4),(R2)+ ;GET U.CW2 SUB #3,R3 ;ARE THERE 3 WORDS LEFT IN INFO BUFFER BLT 190$ ;IF LT NO MOV T.OCBH(R5),R1 ;POINT TO OCB LIST BR 164$ ; 160$: MOV (R1),R1 ;POINT TO NEXT OCB 164$: BEQ 170$ ;IF EQ, END OF OCB LIST CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND BNE 160$ ;IF NE NO MOV O.STAT(R1),(R2)+ ;COPY FIRST HALF OF PARENT NAME MOV O.STAT+2(R1),(R2)+ ;COPY SECOND HALF OF PARENT NAME DEC R3 ;ANOTHER WORD IN BUFFER BLT 190$ ;IF LT NO MOV R1,(R2)+ ;SAVE OCB ADDRESS DEC R3 ;ROOM LEFT IN BUFFER? BLT 190$ ;IF LT, NO MOV O.STAT+4(R1),(R2) ;COPY PROTECTION UIC MOV (R2)+,R0 ;SAVE PROTECTION UIC DEC R3 ;ROOM LEFT IN BUFFER? BLT 190$ ;IF LT, NO MOV O.STAT+6(R1),(R2) ;COPY DEFAULT UIC BIS (R2)+,R0 ;EITHER UIC SPECIFIED? BNE 185$ ;IF NE YES, LEAVE THEM ADD #2,R3 ;RESTORE LENGTH CMP -(R2),-(R2) ;BACK UP INFO BUFFER POINTER BR 180$ ; 170$: CLR (R2)+ ;CLEAR PARENT NAME FIELD CLR (R2)+ ; DEC R3 ;ANOTHER WORD IN BUFFER BLT 190$ ;IF LT NO CLR (R2)+ ;CLEAR OCB ADDRESS FIELD 180$: DEC R3 ;ANOTHER WORD IN BUFFER BLT 190$ ;IF LT NO MOV U.LUIC(R4),(R2)+ ;COPY LOGIN UIC DEC R3 ;ROOM LEFT IN BUFFER BLT 190$ ;IF LT NO MOV U.UIC(R4),(R2)+ ;COPY CURRENT UIC CODE 185$: DEC R3 ;ROOM LEFT IN BUFFER BLT 190$ ;IF LT NO CLR (R2) ;ASSUME DO NOT SUPPLY COMMAND ADDRESS TSTB 4(SP) ;IS COMMAND TO BE DEQUEUED BPL 190$ ;IF PL YES MOV (SP),(R2) ;SUPPLY ADDRESS OF COMMAND BUFFER ; ; COPY COMMAND FROM POOL INTO THE TASK'S BUFFER ; 190$: BIC #T3.MCR!T3.CMD,T.ST3(R5) ;ASSUME NO PROMPT OR SERIAL CMD EXE MOV (SP)+,R5 ;COPY POINTER TO BUFFER IN POOL MOV R5,KISAR6 ;MAP COMMAND IN SEC POOL MOV (SP),R0 ;GET ADDRESS OF BUFFER IN TASK ASSUME C.CSO,C.CMCD MOV @#C.CSO+140000,(SP) ;SAVE START OFFSET OR MSG NUMBER MOVB @#C.CTR+140000,-(SP) ;SAVE COMMAND TERMINATOR MOV @#C.CSTS+140000,-(SP) ;SAVE STATUS WORD MOV @#C.CCT+140000,-(SP) ;SAVE CHARACTER COUNT CALL $RELOC ;RELOCATE BUFFER ADDRESS MOV R1,KISAR6 ;MAP USER'S COMMAND BUFFER MOV R1,R3 ;SAVE APR BIAS BIT #CC.MSG,2(SP) ;IS THIS A MESSAGE PACKET BNE 200$ ;IF NE YES MOV R4,R1 ;COPY UCB ADDRESS MOV (R4),R0 ;POINT TO DCB TST (R0)+ ;POINT TO ADDRESS OF FIRST UCB SUB (R0)+,R1 ;CALC RELATIVE ADDRESS OF UCB MOV (R0)+,(R2)+ ;COPY DEVICE NAME MOV (R0)+,(R2) ;GET LOW UNIT NUMBER FOR DCB MOV R2,-(SP) ;SAVE R2 MOV (R0),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R1 PAIR DIV R2,R0 ;CALC RELATIVE UNIT NUMBER MOV (SP)+,R2 ;RESTORE R2 ADD R0,(R2)+ ;CALC LOGICAL UNIT NUMBER IN LOW BYTE INC (SP) ;INCREASE CHAR COUNT TO INCLUDE CR MOV #1,-(SP) ;REMEMBER TO DECREMENT IT LATER BR 210$ ; 200$: CLR (R2)+ ;ZERO TO INDICATE MESSAGE MOV 6(SP),(R2)+ ;PUT MESSAGE CODE IN BUFFER CLR 6(SP) ;ZERO FOR LATER CODE THAT USES C.CSO CLR 10(SP) ;FORCE MESSAGE BUFFER TO BE DEQUEUED CLR -(SP) ;DO NOT HAVE TO CORRECT CHAR COUNT 210$: MOV 2(SP),R1 ;GET NUMBER OF CHARS IN CMD MOV $TEMP0,R0 ;GET LENGTH OF TASK'S BUFFER SUB #10,R0 ;CALC SPACE AVAILABLE FOR COMMAND CLR -(SP) ;ASSUME LENGTHS WILL BE CORRECT CMP R0,R1 ;COMPARE SIZE OF TASK AND POOL BUFFERS BLO 220$ ;IF LO, USE TASK BUFFER SIZE MOV R1,R0 ;USE POOL BUFFER SIZE BIT #CC.MSG,6(SP) ;IS THIS A MESSAGE BNE 220$ ;IF NE YES, DO NOT DECREMENT ANY COUNTS MOV #400,(SP) ;HAVE TO DECREMENT COUNT IN UPPER BYTE 220$: MOVB R0,-1(R2) ;PUT ACTUAL COUNT IN TASK BUFFER SUB (SP)+,-2(R2) ;CORRECT ACTUAL CHAR COUNT MOV R1,(R2) ;PUT BUFFER SIZE IN TASK BUFFER SUB (SP)+,(R2)+ ;CORRECT SIZE OF ORIGINAL COMMAND TST (SP)+ ;POP C.CCT OFF STACK MOV (SP)+,R1 ;GET STATUS BITS BIC #^C,R1 ;ISOLATE STATUS BITS TO BE PASSED ASH #7,R1 ;SHIFT INTO POSITION BISB (SP)+,R1 ;PUT TERMINATOR CHARACTER IN POSITION MOV R1,(R2)+ ;PUT TERMINATOR AND STATUS BITS IN USER BUF TST R0 ;ANY CHARACTERS TO COPY BEQ 240$ ;IF EQ NO MOV R5,R1 ;SET SOURCE APR BIAS MOV R2,R4 ;DESTINATION DISP MOV #C.CTXT+120000,R2 ;SET SOURCE DISPLACEMENT ADD (SP),R2 ;POINT TO START OF VALID TEXT CALL $BLXIO ;COPY COMMAND INTO TASK'S BUFFER 240$: MOV R5,KISAR6 ;MAP COMMAND AGAIN TST (SP)+ ;CLEAN C.CSO FROM STACK BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGE BNE 260$ ;IF NE YES MOV $TKTCB,R3 ;CURRENT TASK TCB ADDRESS TST @#C.CCT+140000 ;ANY TEXT PRESENT BEQ 250$ ;IF EQ NO CMPB #33,@#C.CTR+140000 ;TERMINATED BY ESCAPE? BEQ 250$ ;IF EQ YES BIS #T3.MCR,T.ST3(R3) ;FORCE PROMPT ON EXIT 250$: BIT #CC.TTD,@#C.CSTS+140000 ;DID CMD ORIGINATE IN TTDRV BEQ 260$ ;IF EQ NO BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT 260$: TSTB (SP)+ ;LEAVE COMMAND PACKET QUEUE? BMI DUN ;IF MI YES MOV R5,R1 ;GET CMD ADDR IN SEC POOL MOV #$CLICQ,R0 ;POINT TO LISTHEAD CALL $GTSPK ;DEQUEUE PACKET MOV R1,R0 ;COPY PACKET ADDRESS MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF PACKET CALLR $DESEC ;DEALLOCATE AND RETURN TO DRDSP DUN: RETURN .ENDC ;A$$CLI .END